/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package compilador.analisadorSintatico.metodos;

import compilador.analisadorLexico.PalavraReservada;
import compilador.analisadorLexico.Token;
import compilador.analisadorLexico.TokenClass;
import compilador.analisadorSintatico.Producao;
import compilador.analisadorSintatico.TokenReader;
import compilador.analisadorSintatico.comandos.NEW;
import compilador.analisadorSintatico.operacoes.EXP;
import compilador.analisadorSintatico.simboloGramatical.NaoTerminal;
import compilador.analisadorSintatico.simboloGramatical.SimboloGramatical;
import compilador.analisadorSintatico.simboloGramatical.Terminal;


/**
 *
 * @author Jneto
 */
public class VALOR extends Producao{

    @Override
    public SimboloGramatical derivar() throws Exception {
        //pega a instância do tokenReader
        TokenReader tokenReader = TokenReader.getInstance();
        //consome o primeiro token
        Token t = tokenReader.seeCurrent();

        if(t.getTokenClass().equals(TokenClass.IDENTIFICADOR)){
             ((NaoTerminal)this.simbolo).add(new EXP().derivar());
             
        }else if(t.getAtributo().equals(PalavraReservada.WRITE) ||
                t.getAtributo().equals(PalavraReservada.READ) ||
                t.getTokenClass().equals(TokenClass.NUMERO) ||
                t.getAtributo().equals("-")||
                t.getAtributo().equals("(") ||
                t.getAtributo().equals("!")){
            
            ((NaoTerminal)this.simbolo).add(new EXP().derivar());
        
        }else if(t.getAtributo().equals(PalavraReservada.NEW)){
            ((NaoTerminal)this.simbolo).add(new NEW().derivar());
        
        }else if(t.getTokenClass().equals(TokenClass.CHARCONST)){
            ((NaoTerminal)this.simbolo).add(new Terminal(tokenReader.consome()));
        
        }else{
            erro("Não é: identificador, 'write', 'read', número, new, '-',  '(', '!' ou  charconst");
            return this.simbolo;
        }


        return  this.simbolo;
    }

    @Override
    public void setSimbolo() {

        this.simbolo = new NaoTerminal("VALOR");

    }

}
